package tp1;

import java.io.*;
import java.net.InetAddress;
import java.net.Socket;
import java.util.HashSet;

/* Thread du client qui lit périodiquement 
 * les listes de groupes/utilisateurs envoyés par le serveur
 */

public class ClientLecture extends Thread{
    public static final String ANSI_RESET = "\u001B[0m";
    public static final String ANSI_BLACK = "\u001B[30m";
    public static final String ANSI_RED = "\u001B[31m";
    public static final String ANSI_GREEN = "\u001B[32m";
    public static final String ANSI_YELLOW = "\u001B[33m";
    public static final String ANSI_BLUE = "\u001B[34m";
    public static final String ANSI_PURPLE = "\u001B[35m";
    public static final String ANSI_CYAN = "\u001B[36m";
    public static final String ANSI_WHITE = "\u001B[37m";

    public String[] coordGroupe = new String[3];
    public boolean groupeRejoint = false;
    public Client clientParent = null; // Client qui a créé la thread
    public Socket ClientSocket = null;
    public BufferedReader reception = clientParent.reception;
    public PrintWriter emission = null;
    public InputStream in = null;
    public InputStreamReader in_reader = null;
    boolean continuer = true;

    public ClientLecture(Socket s)
    {
        ClientSocket = s;
        clientParent=Client.getInstance(); // ajouté : c'est le client qui crée la thread
    }

    public void run(){
      /*  try {
            in = ClientSocket.getInputStream();
            in_reader = new InputStreamReader(in);
        } catch (IOException e) {
            System.out.println(ANSI_RED+"Impossible de se connecter au serveur."+ANSI_RESET);
            e.printStackTrace();
        }
*/
        try {
            while(continuer){
                while (!reception.ready()) {
                    sleep(10);
                }
                emission = new PrintWriter(new OutputStreamWriter(ClientSocket.getOutputStream()));
                //  reception = new BufferedReader(in_reader);
                String msg_serveur = reception.readLine();
                sleep(100);
               clientParent.debug(msg_serveur);
                // Lecture liste de groupes
                if (msg_serveur.length()> 2 && msg_serveur.substring(0, 3).equalsIgnoreCase("LGR")) {
                   clientParent.debug(ANSI_RED + "Reçu LGR : mise à jour de la liste de groupes" + ANSI_RESET);
                    HashSet groupes = new HashSet(); //liste locale, pour mettre à jour la liste du Client
                    int nbGroupes = Integer.parseInt(msg_serveur.substring(3,5));
                clientParent.debug(ANSI_RED + "Reçu LGR : " + nbGroupes + " groupes" + ANSI_RESET);
                    //champs du groupe
                    int position=5,port;
                    String nom;
                    InetAddress adresseMulticast=InetAddress.getLocalHost();
                    // Lecture des groupes contenus dans le message
                    for(int i=1;i<=nbGroupes;i++) {
                        String message = msg_serveur.substring(position,position+30); //decoupe prochaine partie du message
                        adresseMulticast.getByName(message.substring(0,15));
                        port = Integer.parseInt(message.substring(15, 20));
                        nom = message.substring(20);
                        groupes.add(new Groupe(nom,adresseMulticast,port)); // ajoute le groupe à la liste
                        position += 30; // passe au groupe suivant
                    }
                    if(nbGroupes>0) {
                        clientParent.groupes = groupes; //remplace la liste de clients
                    }
                    else {
                        clientParent.groupes.clear();
                    }
                 //   System.out.println(ANSI_RED + "Mise à jour de la liste de groupes OK. Nombre de groupes : " + nbGroupes + ANSI_RESET);
                }

                //lecture liste d'utilisateurs
                if (msg_serveur.length()> 2 && msg_serveur.substring(0, 3).equalsIgnoreCase("LUT")) {
               //     System.out.println(ANSI_RED + "Reçu LUT : mise à jour de la liste d'utilisateurs." + ANSI_RESET);
                    HashSet utilisateurs = new HashSet(); //liste locale, pour mettre à jour la liste du Client
                    int nbUtilisateurs = Integer.parseInt(msg_serveur.substring(3,5));
                    //champs du groupe
                    int position=5,port;
                    String nom;
                    String message;
                    InetAddress adresseClient = null;
                    // Lecture des utilisateurs contenus dans le message
                    for (int i = 1; i <= nbUtilisateurs; i++) {
                        message = msg_serveur.substring(position, position + 26); //decoupe prochaine partie du message
                        adresseClient = InetAddress.getByName(message.substring(0,15));
                        port = Integer.parseInt(message.substring(15,20));
                        nom = message.substring(20, 26);
                        clientParent.debug("Utilisateur n°" + i + " : " + message);
                        clientParent.debug(message.substring(0, 15) + "\n" + port + "\n" + nom);
                        utilisateurs.add(new Utilisateur(nom, adresseClient, port)); // ajoute le groupe à la liste
                        position += 26; // passe à l'utlisateur suivant
                    }
                    if(nbUtilisateurs>0) {
                        clientParent.utilisateurs = utilisateurs; //remplace la liste de clients
                    }
                    else {
                        clientParent.utilisateurs.clear();
                    }
                    clientParent.debug("Mise à jour de la liste des utilisateurs OK. nombre d'utilisateurs : " + nbUtilisateurs);
                }
                if (msg_serveur.length()> 2 && msg_serveur.substring(0, 3).equalsIgnoreCase("rgo")) {
                	System.out.println("[ClientLecture] Groupe rejoint");
                	groupeRejoint = true;
    				coordGroupe = msg_serveur.split(" ");
                }
            }
        } catch (IOException ioe) {
            System.out.println(ANSI_RED + "Exception pendant la communication. Le serveur a probablement fermé la connexion" + ANSI_RESET);
            ioe.printStackTrace();
        } catch (InterruptedException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        } finally {
            try {
                emission.close();
                //  in_reader.close();
                ClientSocket.close();
            } catch (Exception e) {
                e.printStackTrace();
            }
        }
    }
    
    public void arreter(){
        this.continuer = false;
    	}
}
